/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package interfaz;

import Entidades.Habitacion;
import Entidades.Pasajero;
import ManejadorDeErrores.ManejadorVentanaEmergente;
import Excepciones.*;
import gestoresHabitacion.GestorHabitacion;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;






/**
 *
 * @author Pc
 */
public class MostrarEstadoHabitacion extends javax.swing.JFrame {
    
    private SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
    
         private JLabel lbl_Desde = new JLabel();
        private JLabel lbl_Hasta = new JLabel();
        private JTextField  txt_Desde = new JTextField();
        private JTextField  txt_Hasta = new JTextField();
        private JTabbedPane  TabbedPanel = new JTabbedPane();
        private JScrollPane jScrollPane1 = new JScrollPane();
        private JScrollPane jScrollPane2 = new JScrollPane();
         private JScrollPane jScrollPane3 = new JScrollPane();
          private JScrollPane jScrollPane4 = new JScrollPane();
           private JScrollPane jScrollPane5 = new JScrollPane();
      
       
        
        private JTable tablaIndividualEstandar=new JTable();
        private JTable tablaDobleEstandar=new JTable();
        private JTable tablaDobleSuperior=new JTable();
        private JTable tablaSuperiorFamilyPlan=new JTable();
        private JTable tablaSuiteDoble=new JTable();
        
        //modelos que contienen los datos de las habitaciones
        private DefaultTableModel datosIndividualEstandar;
        private DefaultTableModel datosDobleEstandar;
        private DefaultTableModel datosDobleSuperior;
        private DefaultTableModel datosSuperiorFamilyPlan;
        private DefaultTableModel datosSuiteDoble;
        
       // private JButton boton_verEstados = new javax.swing.JButton();
        private JButton boton_Cancelar = new javax.swing.JButton();
        private JButton boton_Siguiente = new javax.swing.JButton();
        
        
       
    public MostrarEstadoHabitacion() {
        this.setResizable(false);
        this.setTitle("Mostrar Estado Habitaciones");
        initComponents();
        mostrarEstados();
             
             
     
        
      
       
      
    }
    
//carga los estados de las habitaciones en la grilla para el rango de fechas establecido
	private void mostrarEstados(Map<Date,Map<Habitacion, String>> estados){
            
            
            for(Date fecha: estados.keySet()){
                
                //creamos el vector con los estados de las habitaciones para cada fecha
                Map<Habitacion, String> mapa=estados.get(fecha);
                Vector <String> estadoIndEstandar=new Vector<>();
                estadoIndEstandar.add(formatoFecha.format(fecha));
                Vector <String> estadoDobleEstandar=new Vector<>();
                estadoDobleEstandar.add(formatoFecha.format(fecha));
                Vector <String> estadoDobleSuperior=new Vector<>();
                estadoDobleSuperior.add(formatoFecha.format(fecha));
                Vector <String> estadoSFP=new Vector<>();
                estadoSFP.add(formatoFecha.format(fecha));
                Vector <String> estadoSuiteDoble=new Vector<>();
                estadoSuiteDoble.add(formatoFecha.format(fecha));
                
                for(Habitacion hab: mapa.keySet()){
                    if(hab.getTipo().getDescripcion().equals("INDIVIDUAL ESTANDAR")){
                        estadoIndEstandar.add(mapa.get(hab));
                        
                }
                    else if(hab.getTipo().getDescripcion().equals("DOBLE ESTANDAR")){
                        estadoDobleEstandar.add(mapa.get(hab));
                }
                     else if(hab.getTipo().getDescripcion().equals("DOBLE SUPERIOR")){
                         estadoDobleSuperior.add(mapa.get(hab));
                }
                     else if(hab.getTipo().getDescripcion().equals("SUPERIOR FAMILY PLAN")){
                         estadoSFP.add(mapa.get(hab));
                }
                     else if(hab.getTipo().getDescripcion().equals("SUITE DOBLE")){
                         estadoSuiteDoble.add(mapa.get(hab));
                }
            }
                
                datosIndividualEstandar.addRow(estadoIndEstandar);
                datosDobleEstandar.addRow(estadoDobleEstandar);
                datosDobleSuperior.addRow(estadoDobleSuperior);
                datosSuperiorFamilyPlan.addRow(estadoSFP);
                datosSuiteDoble.addRow(estadoSuiteDoble);
                   
                
		
	}
        }
        
//metodo que obtiene las celadas seleccionadas de la grilla
        private void getSeleccionada(){
            //verificamos que se haya seleccionado una fila
            if (!(tablaIndividualEstandar.getSelectedRow()==-1)||
                    !(tablaDobleEstandar.getSelectedRow()==-1)||
                    !(tablaDobleSuperior.getSelectedRow()==-1)||
                    !(tablaSuperiorFamilyPlan.getSelectedRow()==-1)||
                    !(tablaSuiteDoble.getSelectedRow()==-1)){
         //variables de habitacion seleccionada
          int Tipo;
           int numeroHab;
           List <String> fechasSeleccionadas=new ArrayList<>();
           Map<String,String> seleccionados;
    
            
            if(TabbedPanel.getSelectedComponent()==jScrollPane1){
                Tipo=1;
                seleccionados=new TreeMap<>();
                numeroHab=tablaIndividualEstandar.getSelectedColumn();
                                
                 
                for(Integer i:tablaIndividualEstandar.getSelectedRows()){
                    
                    //añadimos al map la fecha con el estado de la habitacion en ese dia
                    seleccionados.put(((String)tablaIndividualEstandar.getModel().getValueAt(i, 0)),((String)tablaIndividualEstandar.getModel().getValueAt(i,numeroHab)));
                    fechasSeleccionadas.add((String)tablaIndividualEstandar.getModel().getValueAt(i, 0));       
                    }}
            
            else if(TabbedPanel.getSelectedComponent()==jScrollPane2){
                Tipo=2;
                 seleccionados=new TreeMap<>();
                numeroHab=tablaDobleEstandar.getSelectedColumn();
                                
                 
                for(Integer i:tablaDobleEstandar.getSelectedRows()){
                    
                    //añadimos al map la fecha con el estado de la habitacion en ese dia
                    seleccionados.put(((String)tablaDobleEstandar.getModel().getValueAt(i, 0)),((String)tablaDobleEstandar.getModel().getValueAt(i,numeroHab)));
                    fechasSeleccionadas.add((String)tablaDobleEstandar.getModel().getValueAt(i, 0));  
                     }
                //sumamos correccion del numero de habitacion segun indice de tabla, para que la columna coincida con el num de habitacion
                numeroHab=numeroHab+11;
                
            }
            else   if(TabbedPanel.getSelectedComponent()==jScrollPane3){
                Tipo=3;
                 seleccionados=new TreeMap<>();
                numeroHab=tablaDobleSuperior.getSelectedColumn();
                                
                 
                for(Integer i:tablaDobleSuperior.getSelectedRows()){
                    
                    //añadimos al map la fecha con el estado de la habitacion en ese dia
                    seleccionados.put(((String)tablaDobleSuperior.getModel().getValueAt(i, 0)),((String)tablaDobleSuperior.getModel().getValueAt(i,numeroHab)));
                    fechasSeleccionadas.add((String)tablaDobleSuperior.getModel().getValueAt(i, 0));  
                 }
            //sumamos correccion del numero de habitacion segun indice de tabla, para que la columna coincida con el num de habitacion
                numeroHab=numeroHab+28;
            }
            else if(TabbedPanel.getSelectedComponent()==jScrollPane4){
                Tipo=4;
                 seleccionados=new TreeMap<>();
                numeroHab=tablaSuperiorFamilyPlan.getSelectedColumn();
                                
                 
                for(Integer i:tablaSuperiorFamilyPlan.getSelectedRows()){
                    
                    //añadimos al map la fecha con el estado de la habitacion en ese dia
                    seleccionados.put(((String)tablaSuperiorFamilyPlan.getModel().getValueAt(i, 0)),((String)tablaSuperiorFamilyPlan.getModel().getValueAt(i,numeroHab)));
                    fechasSeleccionadas.add((String)tablaSuperiorFamilyPlan.getModel().getValueAt(i, 0));  
                }
            //sumamos correccion del numero de habitacion segun indice de tabla, para que la columna coincida con el num de habitacion
                numeroHab=numeroHab+36;}
             else {
                Tipo=5;
                seleccionados=new TreeMap<>();
                numeroHab=tablaSuiteDoble.getSelectedColumn();
                                
                 
                for(Integer i:tablaSuiteDoble.getSelectedRows()){
                    
                    //añadimos al map la fecha con el estado de la habitacion en ese dia
                    seleccionados.put(((String)tablaSuiteDoble.getModel().getValueAt(i, 0)),((String)tablaSuiteDoble.getModel().getValueAt(i,numeroHab)));
                    fechasSeleccionadas.add((String)tablaSuiteDoble.getModel().getValueAt(i, 0));  
                    }
            //sumamos correccion del numero de habitacion segun indice de tabla, para que la columna coincida con el num de habitacion
                numeroHab=numeroHab+46;}
           
              //llamamos al gestor para que procese los estados de la habitacion seleccionada
            GestorHabitacion gestorHab=GestorHabitacion.getInstance();
        try {
            gestorHab.procesarSeleccionada(numeroHab, seleccionados);
             
        } 
        //Excepcion si la habitacion esta disponible
        catch (HabitacionDisponibleException ex){
            
            
             
              OcuparHabitacion_SeleccionaPasajeros nuevaOcupacion= new OcuparHabitacion_SeleccionaPasajeros();
              nuevaOcupacion.setCampos(numeroHab,fechasSeleccionadas.get(0),fechasSeleccionadas.get(fechasSeleccionadas.size()-1));
             
        
        
        
        }
        //Excepcion si la habitacion esta reservada
        catch (HabitacionReservadaException ex) {
            
            ManejadorVentanaEmergente manejador=ManejadorVentanaEmergente.getInstance();
            manejador.ventEmerHabitacionReservada(ex);} 
            
        
        //Excepcion si la habitacion esta ocupada
        catch (HabitacionOcupadaException ex){
              ManejadorVentanaEmergente manejador=ManejadorVentanaEmergente.getInstance();
            manejador.ventHabitacionOcupada();}
          //Excepcion si la habitacion esta Fuera de Servicio
          catch (HabitacionFueraServicioException ex){
              
              ManejadorVentanaEmergente manejador=ManejadorVentanaEmergente.getInstance();
            manejador.ventHabitacionFS();}
        
        }
            else{JOptionPane.showMessageDialog(null, "Seleccione al menos una habitacion","Atencion",JOptionPane.WARNING_MESSAGE);
        }
        }
        
    @SuppressWarnings("unchecked")
                            
    private void initComponents() {
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Estado Habitaciones");
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        lbl_Desde.setText("Desde:");
        lbl_Hasta.setText("Hasta:");
        txt_Desde.setText("15/06/2014");
        txt_Hasta.setText("20/06/2014");
       

      //creo el TableModel con los titulos de la tabla de consulta
      datosIndividualEstandar=new DefaultTableModel( new String [] {"Fecha", "1","2","3","4", "5","6","7","8", "9","10"}, 0);
       
      //creo la tabla con los datos anteriores
	 tablaIndividualEstandar = new JTable(datosIndividualEstandar);
         tablaIndividualEstandar.setDefaultRenderer (Object.class, new ColoreaCeldas());
         jScrollPane1.setViewportView(tablaIndividualEstandar);
//añadimos la tabla a una pestaña
        TabbedPanel.addTab("Individual Estandar", jScrollPane1);

        //creo el TableModel con los titulos de la tabla de consulta
      datosDobleEstandar=new DefaultTableModel( new String [] {"Fecha", "11","12","13","15","16","17","18","19","20","21","22","23","24","25","26","27","28"}, 0);
       
      //creo la tabla con los datos anteriores
	 tablaDobleEstandar = new JTable(datosDobleEstandar);
         tablaDobleEstandar.setDefaultRenderer (Object.class, new ColoreaCeldas());
         jScrollPane2.setViewportView(tablaDobleEstandar);
//añadimos la tabla a una pestaña
        TabbedPanel.addTab("Doble Estandar", jScrollPane2);
        

      //creo el TableModel con los titulos de la tabla de consulta
      datosDobleSuperior=new DefaultTableModel( new String [] {"Fecha", "29","30","31","32","33","34","35","36"}, 0);
       
      //creo la tabla con los datos anteriores
	 tablaDobleSuperior = new JTable(datosDobleSuperior);
         tablaDobleSuperior.setDefaultRenderer (Object.class, new ColoreaCeldas());
         jScrollPane3.setViewportView(tablaDobleSuperior);
//añadimos la tabla a una pestaña
        TabbedPanel.addTab("Doble Superior", jScrollPane3);
        
        //creo el TableModel con los titulos de la tabla de consulta
      datosSuperiorFamilyPlan=new DefaultTableModel( new String [] {"Fecha","37","38", "39","40","41","42","43","44","45","46"}, 0);
       
      //creo la tabla con los datos anteriores
	 tablaSuperiorFamilyPlan = new JTable(datosSuperiorFamilyPlan);
         tablaSuperiorFamilyPlan.setDefaultRenderer (Object.class, new ColoreaCeldas());
         jScrollPane4.setViewportView(tablaSuperiorFamilyPlan);
//añadimos la tabla a una pestaña
        TabbedPanel.addTab("Superior Family Plan", jScrollPane4);
        
        //creo el TableModel con los titulos de la tabla de consulta
      datosSuiteDoble=new DefaultTableModel( new String [] {"Fecha", "47","48"}, 0);
       
      //creo la tabla con los datos anteriores
	 tablaSuiteDoble = new JTable(datosSuiteDoble);
         tablaSuiteDoble.setDefaultRenderer (Object.class, new ColoreaCeldas());
         jScrollPane5.setViewportView(tablaSuiteDoble);
//añadimos la tabla a una pestaña
        TabbedPanel.addTab("Suite Doble", jScrollPane5);

       //botones y sus action listener
     
        txt_Desde.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_FechaActionPerformed(evt);
            }
        });
          
        txt_Hasta.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_FechaActionPerformed(evt);
            }
        });
        
        boton_Cancelar.setText("CANCELAR");
        boton_Cancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                boton_CancelarActionPerformed(evt);
            }
        });
        
            boton_Siguiente.setText("SIGUIENTE");
        boton_Siguiente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                boton_SiguienteActionPerformed(evt);
            }
        });
        
        //posicionar elementos

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(lbl_Desde, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_Desde, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(56, 56, 56)
                .addComponent(lbl_Hasta, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_Hasta, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(158, 158, 158))
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(TabbedPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 579, javax.swing.GroupLayout.PREFERRED_SIZE))
                    )
                .addContainerGap(22, Short.MAX_VALUE)
            ).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(127, 127, 127)
                .addComponent(boton_Cancelar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(boton_Siguiente)
                .addGap(168, 168, 168))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txt_Desde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbl_Desde, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbl_Hasta, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txt_Hasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 16, Short.MAX_VALUE)
                
                .addComponent(TabbedPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(61, 61, 61)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(boton_Siguiente)
                    .addComponent(boton_Cancelar))
                .addGap(27, 27, 27))
        );

        pack();
    }// </editor-fold>                        

    //al presionar el enter en las fechas actualizamos las fechas de intervalo
 private void mostrarEstados() { 
    
     int limpiar=datosIndividualEstandar.getRowCount();
             for(int i=limpiar;i>0;i--){
                     datosIndividualEstandar.removeRow(i-1); 
                    datosDobleEstandar.removeRow(i-1);
                   datosDobleSuperior.removeRow(i-1);
                   datosSuperiorFamilyPlan.removeRow(i-1);
                    datosSuiteDoble.removeRow(i-1);
             }
         
        GestorHabitacion gestorHab=GestorHabitacion.getInstance();
       try{ 
           
       gestorHab.validarFechas(txt_Desde.getText(), txt_Hasta.getText());
       Map<Date,Map<Habitacion, String>> estados=gestorHab.comprobarEstado(txt_Desde.getText(), txt_Hasta.getText());
       mostrarEstados(estados);
      
      }
       catch(FechaInvalidaException ex){
        ManejadorVentanaEmergente manejador= ManejadorVentanaEmergente.getInstance();
           manejador.ventEmerFechaInvalida(ex);
       }
       

     
    }  
 
 //accion cuando se presion el boton siguiente -> se procesa la seleccion
 private void boton_SiguienteActionPerformed(java.awt.event.ActionEvent evt) {
    
 getSeleccionada();
 }
 
 //accion cuando se presiona Enter sobre los campos de fecha-> se procede a validar y buscar estados
 private void txt_FechaActionPerformed(java.awt.event.ActionEvent evt) { 
 mostrarEstados();}
 
 //accion del boton cancelar --> Salida
 private void boton_CancelarActionPerformed(java.awt.event.ActionEvent evt) { 
 this.dispose();}

  
    public static void main(String args[]) {
        
      java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MostrarEstadoHabitacion().setVisible(true);
            }
        });
    }

                  
}
